Tema 02 - Manipulación de datos relacionales

Análisis de Datos Multivariantes aplicado al Marketing - Curso 2023/24
Universidad de Alicante

Pedro Albarrán

Dpto. de Fundamentos del Análisis Económico. Universidad de Alicante

Múltiples tablas de datos

  • Analizar datos suele implicar múltiples tablas

    • diferentes orígenes: ej., dptos. de empresa (personal, ventas, almacén)

    • almacenamiento más eficiente: elementos “similares” dentro de una tabla y diferentes entre ellas

  • Para poder combinar la información los datos deben ser relacionales: cada par de tablas están relacionadas mediante identificadores llamados claves

  • P.e., la biblioteca nycflights13 contiene varias tablas: el nombre de la compañía está “codificado” en flights y se puede encontrar en airlines
flights %>% select(dep_time,arr_time,carrier:dest) 
airlines
  • Ambas tablas contienen un identificador común clave (“key”): carrier

Relaciones entre tablas

Datos relacionales

  • Tipos de claves:

    • Primaria (o interna): identifican de forma única cada observación en una tabla. Puede ser una sola variable (en planes) o múltiples (en weather)

      • Subrogada = número de fila, si la tabla carece de identificación única
    • Secundaria (o externa): señala a la clave primaria de otra tabla

  • Una clave primaria y una externa (asociada) en otra tabla forman una relación:

    • de uno-a-muchos (ej., vuelos y aviones), de uno-a-uno, de muchos-a-muchos (ej., aerolíneas y aeropuertos), de muchos-a-uno
  • Operaciones que se pueden realizar con dos tablas: uniones de transformación, uniones de filtro y operaciones de conjunto

Uniones de transformación

  • Añaden nuevas variables a una tabla desde filas coincidentes en otra.
  • cbind() o bind_columns(): nuevas columnas para filas en el mismo orden
  • Dos argumentos obligatorios: las tablas que se unen
flights2 <- flights %>% select(year:day, hour, origin, dest, carrier, tailnum)
left_join(flights2, airlines)     # añade el nombre de las compañías en la tabla de vuelos
flights2 %>% left_join(airlines)

Argumento by: ¿Cómo se emparejan las tablas?

  • Por defecto se usan todas las variables que aparezcan en ambas tablas
flights2 %>% left_join(weather)    # coinciden en año, mes, día, hora y origen        
  • No siempre deseable o posible: ej., año no es lo mismo en flights y planes
  • by = c("varX", "varY"): para usar sólo algunas variables comunes
flights2 %>% left_join(planes, by = c("tailnum"))   # también: by = "tailnum"  
flights2 %>% left_join(weather, by = c("year", "month", "day", "hour", "origin"))
  • Las columnas con el mismo nombre (ej., año) se desambigúan con un sufijo

  • by = c("x1" = "y1", "x2" = "y2") para emparejar la variable x1 en la primera tabla con la variable y1 en la segunda, y la variable x2 con y2

flights2 %>% left_join(airports, by = c("dest" = "faa"))    # aeropuerto de destino

Unión interna

df1 <- tibble(clave = c(1:3), val_x = c("x1", "x2", "x3"))
df2 <- tibble(clave = c(1:2, 4), val_y = c("y1","y2","y4"))
  • inner_join(x, y) sólo incluye observaciones que coincidan en x y y.
df1 %>% inner_join(df2)

Uniones externas

  • Cuando una fila no coincide en una unión externa, las nuevas variables se rellenan como valores ausentes

  • left_join(x, y): mantiene todas las observaciones en x, coincidan o no con la de y

    • (no se pierden observaciones de la tabla primaria)
  • right_join(x, y): mantiene todas las observaciones en y

  • full_join(x, y): incluye todas las observaciones de x e y

Uniones externas (cont.)

df1 %>% left_join(df2)

\(\hspace{0.5cm}\)

df1 %>% right_join(df2)    

\(\hspace{0.5cm}\)

df1 %>% full_join(df2)   
  • Notar que df1 %>% right_join(df2) es igual que df2 %>% left_join(df1), pero con diferente orden columnas

Claves duplicadas

  • Si una coincidencia no es única, se generan todas las combinaciones posibles (producto cartesiano) de las observaciones coincidentes
  • En una tabla: añade información en una relación de uno a muchos.
  • En ambas tablas: igualmente, todas las combinaciones posibles
    • posible error: NO hay clave primaria única

Uniones de filtro

  • Filtra las observaciones de la tabla de la izquierda basándose en si coinciden o no con una observación de la otra tabla

  • Se tiene un subconjunto de las filas de la tabla de la izquierda

  • semi_join(x, y) mantiene todas las observaciones en x que coinciden en y

df1 %>% semi_join(df2)
  • anti_join(x, y) elimina todas las observaciones en x que coinciden en y

df1 %>% anti_join(df2)

Uniones de filtro (cont.)

  • Claves duplicadas: en uniones de filtro sólo importa la existencia de una coincidencia, NO qué observación coincida \(\Rightarrow\) NUNCA duplica filas

Aplicaciones de anti_join() y semi_join()

  • Son útiles para diagnosticar desajustes de uniones (qué observaciones serán emparejadas), porque solo eliminan y nunca duplican observaciones
flights %>% anti_join(planes, by = "tailnum") %>%   # vuelos sin información del avión
              count(tailnum, sort = TRUE)
  • Pueden ser equivalentes a usar filter(), con tablas previamente resumidas
top_dest <- flights %>% count(dest, sort = TRUE) %>% head(10)   # destinos populares
flights %>% filter(dest %in% top_dest$dest)
flights %>% semi_join(top_dest)
  • Pero permiten filtrados complejos fácilmente: ej., los diez días con más vuelos necesita un filtro con varias variables (year, month, day)

Operaciones de conjunto

  • Trabajan con filas completas, comparando valores de cada variable.

  • Esperan que x e y tengan las mismas variables, y tratan las observaciones (filas) como elementos de un conjunto.

  • Útil cuando se quiere dividir un filtro complejo en piezas más simples.

df1 <- tibble(x = 1:2, y = c(1, 1))
df2 <- tibble(x = c(1,1), y = 1:2)

intersect(df1, df2)     # solo filas tanto en df1 como en df2
union(df1, df2)         # filas únicas en ambas tablas df1 y df2` 
union_all(df1, df2)     # todas las filas de df1 y df2, manteniendo duplicados 
setdiff(df1, df2)       # filas en df1, pero no en df2
setdiff(df2, df1)   

Equivalencia con bases de datos SQL

  • SQL soporta más tipos de unión y puede trabajar con más de dos tablas.